﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Fuyao.Business.Entities.Models;
using Fuyao.Business.Logic.BC;
using Fuyao.Win.UI.Util;
using Fuyao.Win.UI.Common;

namespace Fuyao.Win.UI.Mantenimientos
{
    public partial class frmProductos : Form
    {
        BusinessLogic bc = new BusinessLogic();

        #region Propiedades
        public bool action { get; set; }
        Producto beProd { get; set; }
        public int ProductoID { get; set; }
        #endregion       

        public frmProductos()
        {
            InitializeComponent();
        }

        private void frmProductos_Load(object sender, EventArgs e)
        {
            loadUI();
        }

        private void loadUI()
        {
            loadDefaultInformation();
            if (ProductoID == 0) newProducto();
            else editProducto();               
        }

        private void loadDefaultInformation()
        {
            action = false;
            this.cboEstado.SelectedIndex = 0;
            if (ProductoID == 0)
            {
                this.cboEstado.Enabled = false;
                this.Text = "NUEVO PRODUCTO";
            }
            else
            {
                this.cboEstado.Enabled = true;
                this.Text = "EDITAR PRODUCTO";
            }
        }

        private void editProducto()
        {
            beProd = bc.getProductsById(ProductoID);
            cargarDatosProducto(beProd);
        }

        private void cargarDatosProducto(Producto beProd)
        {
            this.txtCodigo.Text = beProd.CodigoProducto;
            this.txtCaracteristica.Text = beProd.Caracteristica;
            this.txtCatacteristica2.Text = beProd.Caracteristica2;
            this.txtDescripcion.Text = beProd.DescripcionProducto;
            this.txtPrecio.Text = beProd.Precio.ToString();
            this.txtDescuento.Text = beProd.Descuento.ToString();
            this.txtCategoria.Text = beProd.CategoriaAuto;
            this.txtCantidad.Text = beProd.Cantidad.ToString();
            this.txtAncho.Text = beProd.Ancho.ToString();
            this.txtAlto.Text = beProd.Alto.ToString();
            this.chkbIsFront.Checked = (bool)beProd.EsParabrisaFrontal;
            this.cboEstado.SelectedIndex = (beProd.Estado == true ? 0 : 1);
        }

        private void newProducto()
        {
            beProd = new Producto();           
            beProd.CreadoPor = VariablesGlobales.GlobalEnUsuario.UsuarioID;
        }

        private Producto llenarEntidadProducto()
        {
            beProd.ProductoID = ProductoID;
            beProd.CodigoProducto = this.txtCodigo.Text.Trim();
            beProd.Caracteristica = this.txtCaracteristica.Text.Trim();
            beProd.Caracteristica2 = this.txtCatacteristica2.Text.Trim();
            beProd.DescripcionProducto = this.txtDescripcion.Text.Trim();
            beProd.Precio = Convert.ToDecimal(this.txtPrecio.Text);
            beProd.Descuento = Convert.ToDecimal(this.txtDescuento.Text);
            beProd.Alto = Convert.ToDecimal(this.txtAlto.Text);
            beProd.Ancho = Convert.ToDecimal(this.txtAncho.Text);
            beProd.Cantidad = Convert.ToInt32(this.txtCantidad.Text);
            beProd.CategoriaAuto = this.txtCategoria.Text.Trim();
            beProd.Estado = this.cboEstado.SelectedIndex == 0 ? true : false;
            beProd.EsParabrisaFrontal = this.chkbIsFront.Checked;
            beProd.CreadoPor = VariablesGlobales.GlobalEnUsuario.UsuarioID;
            return beProd;
        }

        private void btnGrabar_Click(object sender, EventArgs e)
        {
            if (validarCamposRequeridos())
            {                
                if (ProductoID == 0) //true:Insert
                {
                    if (bc.InsertProducto(llenarEntidadProducto()))
                    {
                        MessageBox.Show("Se ingresaron los datos correctamente", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        cerrarForm();
                    }
                    else
                        MessageBox.Show("Error al ingresar los datos, contacte con Sistemas", "Sistema FUYAO - Mensaje de Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                else //true:Editar
                {
                    if (bc.UpdateProducto(llenarEntidadProducto()))
                    {
                        MessageBox.Show("Se actualizaron los datos correctamente", "Sistema FUYAO - Mensaje de Confirmación", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        cerrarForm();
                    }
                    else
                        MessageBox.Show("Error al actuallizar los datos, contacte con Sistemas", "Sistema FUYAO - Mensaje de Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }

        private void cerrarForm()
        {
            this.Close();
            action = true;
        }

        private bool validarCamposRequeridos()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("Ingrese los campos requeridos: " + System.Environment.NewLine);

            bool isValid = true;

            if (String.IsNullOrEmpty(txtCodigo.Text))
            {
                sb.Append("- Código" + System.Environment.NewLine);
                ErrorProv.SetError(txtCodigo, "Ingrese el código del producto");
                isValid = false;
            }            

            if (String.IsNullOrEmpty(txtDescripcion.Text))
            {
                sb.Append("- Descripción" + System.Environment.NewLine);
                ErrorProv.SetError(txtDescripcion, "Ingrese la descripción del producto");
                isValid = false;
            }

            if (String.IsNullOrEmpty(txtCategoria.Text))
            {
                sb.Append("- Categoría" + System.Environment.NewLine);
                ErrorProv.SetError(txtCategoria, "Ingrese la categoría del producto");
                isValid = false;
            }          

            if (!isValid)
                MessageBox.Show(sb.ToString(), "Sistema FUYAO - Validando opción", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

            return isValid;
        }        

        private void txtDescuento_Leave(object sender, EventArgs e)
        {
             double _valor;
             if (double.TryParse(txtDescuento.Text, out _valor))
             {
                 txtDescuento.Text = Utilitarios.FormatoPrecio(_valor);
                 Utilitarios._contadorDePuntos = 0;
             }
             else txtDescuento.Text = "0.00";
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (ProductoID == 0)
            {
                foreach (Control c in groupBox1.Controls)
                {
                    if (c is TextBox) ((TextBox)c).Text = string.Empty;
                    if (c is CheckBox) ((CheckBox)c).Checked = false;
                }
                this.txtDescuento.Text = "0.00";
                this.txtPrecio.Text = "0.00";
                this.txtAncho.Text = "0.00";
                this.txtAlto.Text = "0.00";
                this.txtCantidad.Text = "0";
                newProducto();

            }
            else resetDatosControles(); //else:Edit      
        }

        private void resetDatosControles()
        {
            cargarDatosProducto(beProd);
        }

        private void frmProductos_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.cerrarFormularioEscape(e, this);
        }

        private void txt_TextChanged(object sender, EventArgs e)
        {
            TextBox tbx = (TextBox)sender;
            ErrorProv.SetError(tbx, "");
        }

        private void txt_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.vPrecio(e);
        }

        private void txtPrecio_Leave(object sender, EventArgs e)
        {
            double _valor;
            if (double.TryParse(txtPrecio.Text, out _valor))
            {
                txtPrecio.Text = Utilitarios.FormatoPrecio(_valor);
                Utilitarios._contadorDePuntos = 0;
            }
            else txtPrecio.Text = "0.00";
        }

        private void txtCantidad_KeyPress(object sender, KeyPressEventArgs e)
        {
            Utilitarios.vSoloNumeros(e);
        }

        private void txtAlto_Leave(object sender, EventArgs e)
        {
            double _valor;
            if (double.TryParse(txtAlto.Text, out _valor))
            {
                txtAlto.Text = Utilitarios.FormatoPrecio(_valor);
                Utilitarios._contadorDePuntos = 0;
            }
            else txtAlto.Text = "0.00";
        }

        private void txtAncho_Leave(object sender, EventArgs e)
        {
            double _valor;
            if (double.TryParse(txtAncho.Text, out _valor))
            {
                txtAncho.Text = Utilitarios.FormatoPrecio(_valor);
                Utilitarios._contadorDePuntos = 0;
            }
            else txtAncho.Text = "0.00";
        }

        private void txtCantidad_Leave(object sender, EventArgs e)
        {
            int _valor;
            if (!int.TryParse(txtCantidad.Text, out _valor)) txtCantidad.Text = "0";
        }    
       
    }
}
